package demo05;

import java.io.File;
import java.io.FileFilter;
import java.io.FileNotFoundException;

/*
 *  文件检索：
 *  案例要求：搜索相对路径file目录中的所有.java文件
 *  案例分析：
 *      1. listFiles方法使用FileFilter接口作为参数，需要传递子类对象，重写其中方法；可以选择匿名内部类方式，比较简单
 *      2. accept方法参数为File，表示当前File下所有的子文件和子目录。保留住则返回true，过滤掉则返回false。保留规则：
 *          1. 是.java文件，则返回true
 *          2. 是目录，则返回true，用于继续遍历
 *      3. 通过过滤器的作用，listFiles(FileFilter)返回的数组元素中，子文件对象都是符合条件的，可以直接打印
 */
public class Demo02FileFilter {
    public static void main(String[] args) {
        findJavaFile(new File("file"));
    }

    private static void findJavaFile(File file) {
        if (file.exists()) {
            for (File fileName : file.listFiles(new FileFilter() {
                @Override
                public boolean accept(File pathname) {
                    // pathname为文件夹 或 pathname为.java结尾，则存入到文件数组中，否则被过滤器过滤
                    return pathname.isDirectory() || pathname.getPath().toLowerCase().endsWith(".java");
                }
            })) {
                if (fileName.isDirectory()) {
                    findJavaFile(fileName);
                } else {
                    System.out.println(fileName.getAbsolutePath()); // 打印绝对路径
                }
            }
        } else {
            try {
                throw new FileNotFoundException("非真实文件！");
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
        }
    }
}
